package Modelo;

import java.util.Stack;

public class Pooglin extends Thread implements PoseedorDeHabilidad {
	private boolean vivo;
	private Numeros velocidad;
	private Numeros velocidadFatalChoque;
	private int sentido;
	private int tipoVelocidad;
	public int getSentidoVertical(){
		return tipoVelocidad;
	}
	public void caer(){
		tipoVelocidad=Constantes.abajo;
	}
	public void caminar(){
		tipoVelocidad=Constantes.reposo;
	}
	private Habilidad habilidad;
	private Stack <Habilidad> habilidadesAEjecutar;
	
	public Numeros getVelocidad(){
		return velocidad;
	}
	
	public void setVelocidad(Numeros velocidad){
		this.velocidad=velocidad;
	}
	
	public int getSentido(){
		return sentido;
	}
	public void invertirSentido(){
		if(sentido==Constantes.derecha)
			sentido=Constantes.izquierda;
		else
			sentido=Constantes.derecha;
	}
	private Mapa mapa;
	public Mapa getMapa(){
		return mapa;
	}
	
	public Pooglin(Mapa mapa){
		this.mapa=mapa;
		tipoVelocidad=Constantes.reposo;
		velocidadFatalChoque= new Real(Constantes.gravedad*Constantes.maxBloqueCaida);
		velocidad= new Real(0);	
		sentido=Constantes.direccionInicial;
		habilidad=null;
		habilidadesAEjecutar=new Stack<Habilidad>();
		vivo=true;
	}
	
	public void run(){
		while(estaVivo()){
			// orden de ejecucion: caer - habilidad - caminar
			habilidadesAEjecutar.push(new Paso());
			if(habilidad!=null)
				habilidadesAEjecutar.push(habilidad);
			habilidadesAEjecutar.push(new Caida());
			// si puedo, ejecuto las habilidades de la pila
			while(!habilidadesAEjecutar.empty()){
				Habilidad aEjecutar=(Habilidad) habilidadesAEjecutar.pop();
				if(aEjecutar.esEjecutableSobre(this)){
					// pido el tiempo antes, porque sino el personaje puede
					// haberse modificado al ejecutar la habilidad
					
					long tiempo=aEjecutar.tiempoDeEjecucion(this);
					aEjecutar.ejecutarSobre(this);
					try{
				  		sleep(tiempo);
					}
					catch(InterruptedException e){}
				}
			}							
		}
	}
	
	public void morir() {
		vivo=false;
	}

	public void chocar() {
		if(velocidadFatalChoque.compareTo(velocidad)<=0&&tipoVelocidad==Constantes.abajo)
			morir();		
	}

	public boolean estaVivo() {
		return vivo;
	}

	public void asignarHabilidad(Habilidad habilidad){
		if(this.habilidad==null)
			this.habilidad=habilidad;
	}
	
	public void eliminarHabilidad(Habilidad habilidad){
		habilidad=null;
	}
}